'use strict'

const titbit = require('titbit')
const { cookie, session } = require('titbit-toolkit')
const token = require('titbit-token')

let tok = new token({
    //token有效期，单位是秒
    expires: 30,

    //必须是32位字母数字
    key: '1fuwine75ernej8vrw4ft8d3gdwf95sb',

    //必须是16位字母数字
    iv: '4fg6rtgd5vbnd7hz'
})

const app = new titbit({
    debug: true
})
//必须先cookie在session，因为session是基于cookie来实现的，不是一定要成对出现,但使用时经常一起出现
app.use(new cookie)
    .use(new session)  //session会做文件的存储，在用户--共用--sess里
//用app.use调用的函数叫做中间件，middleware
//执行的话会先执行这个，在执行下一个的next，在执行get。如果没有next(),则停止执行下一步
//可能有的没home权限，但是仍然会有x-text-key属性，所有都有x-text-key属性
//c是添加路由的执行上下文
app.use(async (c, next) => {
    c.setHeader('x-text-key', `${Math.random()}`)
    await next()
})

app.use(async (c, next) => {
    //做了个拦截，当query的say为12345时 如localhost:12345/?say=12345时执行下边的get，输出‘ok’
    if (c.query.say === '12345') {
        await next()
    } else {
        c.status(403).send('deny')
    }
}, { name: ['home'], method: ['GET'] })  //通过参数进行绑定关联，当发起get请求时，开启权限验证，只有当路由是home用户是才可以

app.get('/', async c => {
    c.send('ok')
}, { name: 'home', group: 'home' }) //表示给这个路由器起个名，分组在home组里。可通过c.name和c.group来获取
//性能最好的是分组

app.get('/test', async c => {
    c.send('test is ok')
})

//会和下边的decrypt/:token冲突，先注释掉
// app.get('/:x/:y', async c => {
//     //只有当启动session挂载的时候才可以使用这个函数
//     c.setSession('x', c.param.x)
//     c.setSession('y', c.param.y)
//     c.send(c.getSession())
// })

//token解析，上边加密，下边解析，超时会false
app.get('/token', async c => {
    let tk = tok.make({
        id: '123',
        user: 'node',
        level: 12
    })
    c.send(tk)
})

app.get('/decrypt/:token', async c => {
    c.send(tok.verify(c.param.token))
})

app.run(12345)